package com.quanquan.utils;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

/**
 * excel工具类
 * @author Administrator
 *
 */
public class ExcelUtils {

    /**
     * @param outPutFileName 文件名
     * @param columns        表头列名
     * @param dataList       待导出的集合
     * @param xlsType        文件格式 1--2003版 后缀xls，2--2007版 后缀xlsx 文件更小 容量更大 默认2003版
     * @return Workbook
     */
    public static Workbook getWorkBook(String outPutFileName, List<String> columns, List<Object[]> dataList, Integer xlsType) {
        Workbook workbook = new HSSFWorkbook();
        if (xlsType != null && xlsType == 2) {
            workbook = new XSSFWorkbook();
        }
        // 生成一个表格
        Sheet sheet = workbook.createSheet(outPutFileName);
        sheet.setDefaultColumnWidth(20);
        // 产生表格标题行
        Row row = sheet.createRow(0);
        //设置表头
        Cell cell = row.createCell(0);
        for (int i = 0; i < columns.size(); i++) {
            if (i == 0) {
                cell.setCellValue(columns.get(i));
            } else {
                cell = row.createCell(i);
                cell.setCellValue(columns.get(i));
            }
        }
        /**
         * 1.查找数据
         * 2.设置表格内容
         */
        for (int i = 0; i < dataList.size(); i++) {
            row = sheet.createRow(i + 1);
            for (int j = 0; j < dataList.get(i).length; j++) {
                Object val = dataList.get(i)[j];
                row.createCell(j).setCellValue(val == null ? "" : val.toString());
            }
        }
        return workbook;
    }

    /**
     * 下载
     * @param response
     * @param outPutFileName 文件名
     * @param columns        表头列名
     * @param dataList       待导出的集合
     * @param xlsType        文件格式 1--2003版 后缀xls，2--2007版 后缀xlsx 文件更小 容量更大 默认2003版
     */
    public static void download(HttpServletResponse response, String outPutFileName, List<String> columns
        , List<Object[]> dataList, Integer xlsType) throws IOException {

        Workbook workBook = getWorkBook(outPutFileName, columns, dataList, xlsType);
        //取得输出流
        OutputStream output = response.getOutputStream();
        //清空输出流
        response.reset();
        //设置响应头和下载保存的文件名
        response.addHeader("Content-Type", "text/html; charset=utf-8");
        String extensions = ".xls";
        if (xlsType == 2) {
            extensions = ".xlsx";
        }
        String filename = new String(outPutFileName.getBytes("UTF-8"), "ISO8859-1").concat(extensions);
        response.setHeader("content-disposition", "attachment;filename=" + filename);
        //定义输出类型
        response.setContentType("APPLICATION/msexcel");
        workBook.write(output);
        output.flush();
        output.close();
        //这一行非常关键，否则在实际中有可能出现莫名其妙的问题！！！
        response.flushBuffer();//强行将响应缓存中的内容发送到目的地
    }

    /**
     * 导出XLS数据公共方法
     *
     * @param @param dataList 待导出的集合
     * @param @param fileName 文件名称，不包括后缀
     * @param @param columNameI 导出字段名称与表列名称的对应关系（支持按序导出）
     * @param @param xlsType 文件格式 1--2003版，2--2007版
     * @return void
     * @Description:
     * @date 2015-12-07下午2:00:05
     */
    public static String exportXLSRecord(HttpServletRequest request, List<Object[]> dataList, String fileName, List<String> columName) {
        //设置文件保存路径
        String path = "C:\\upload" + File.separator + fileName + ".xls";
        Workbook workBook = getWorkBook(fileName, columName, dataList, 1);
        //输出到表格中
        FileOutputStream fout;
        try {
            fout = new FileOutputStream(path);
            workBook.write(fout);
            fout.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(path);
        return path;
    }



    /**
     * EXCL数据封装有主详情况数据
     * @author Administrator
     */
    public static class Form{
    	/**
    	 * 主表各字段值
    	 */
    	Object[] element;

    	/**
    	 * 明细表集合Object[]表示明细表各字段值
    	 */
    	List<Object[]> listDetails;

		public Object[] getElement() {
			return element;
		}
		/**
		 * 添加主表各字段值
		 * @param element
		 */
		public void setElement(Object[] element) {
			this.element = element;
		}
		public List<Object[]> getListDetails() {
			return listDetails;
		}
		/**
		 * 明细表集合Object[]表示明细表各字段值
		 * @param listDetails
		 */
		public void setListDetails(List<Object[]> listDetails) {
			this.listDetails = listDetails;
		}
    }
}
